// @Description
// @Author  xiaoyang
// @Date  2023/4/27 3:06 下午

package lib

import (
	"errors"
	"github.com/gin-gonic/gin"
	ut "github.com/go-playground/universal-translator"
	"gopkg.in/go-playground/validator.v9"
	"strings"
)

// DefaultGetValidParams
// @Description:  参数校验 （有想到更好的方法可以修正）
//
//	实现方式：
//		1.路由中初始化 验证器和翻译器；注入到路由中
//		2.根据请求Header中的参数决定返回内容的语言
//		3.*gin.Context 中获取 验证器和翻译器
//
// @Author yang 2025-11-26 17:48:44
// @Param c
// @Param params
// @Return error
func DefaultGetValidParams(c *gin.Context, params interface{}) error {

	if err := c.ShouldBind(params); err != nil {
		return err
	}

	//获取验证器
	valid, err := GetValidator(c)
	if err != nil {
		return err
	}
	//获取翻译器
	trans, err := GetTranslation(c)
	if err != nil {
		return err
	}

	if errStruct := valid.Struct(params); errStruct != nil {
		errs := errStruct.(validator.ValidationErrors)
		sliceErrs := []string{}
		for _, e := range errs {
			sliceErrs = append(sliceErrs, e.Translate(trans))
		}
		return errors.New(strings.Join(sliceErrs, ","))
	}
	return nil
}

// GetValidator
// @Description:  获取验证器
// @Author yang 2025-11-26 17:47:00
// @Param c
// @Return *validator.Validate
// @Return error
func GetValidator(c *gin.Context) (*validator.Validate, error) {
	// @Todo 路由中间件注入 ValidatorKey
	val, ok := c.Get(ValidatorKey)
	if !ok {
		return nil, errors.New("未设置验证器")
	}
	validate, ok := val.(*validator.Validate)
	if !ok {
		return nil, errors.New("获取验证器失败")
	}
	return validate, nil
}

// GetTranslation
// @Description:  获取翻译器
// @Author yang 2025-11-26 17:47:15
// @Param c
// @Return ut.Translator
// @Return error
func GetTranslation(c *gin.Context) (ut.Translator, error) {
	// @Todo 路由中间件注入 TranslatorKey
	trans, ok := c.Get(TranslatorKey)
	if !ok {
		return nil, errors.New("未设置翻译器")
	}
	translator, ok := trans.(ut.Translator)
	if !ok {
		return nil, errors.New("获取翻译器失败")
	}
	return translator, nil
}
